sizerequest: Stop clamping for_size to natural size
authorBenjamin Otte <otte@redhat.com>
Sat, 22 Feb 2020 04:23:41 +0000 (05:23 +0100)
committerBenjamin Otte <otte@redhat.com>
Sat, 22 Feb 2020 06:33:23 +0000 (07:33 +0100)
Widgets should be given the actual size they will be allocated, so they
can do something with it.

If they want to clamp themselves to their natural size, nothing's
stopping them, they know their natural size after all.

gtk/gtksizerequest.c

index 83dbd2f0c67b383b39ff41496ea46d475b65ac2b..0f4c25acf1f29979d247ca6a3d785e2ec56c9644 100644 (file)
@@ -182,6 +182,7 @@ gtk_widget_query_size_for_orientation (GtkWidget        *widget,
       int css_min_for_size;
       int css_extra_for_size;
       int css_extra_size;
+      int widget_margins_for_size;
 
       style = gtk_css_node_get_style (gtk_widget_get_css_node (widget));
       get_box_margin (style, &margin);
@@ -196,6 +197,7 @@ gtk_widget_query_size_for_orientation (GtkWidget        *widget,
           css_extra_for_size = margin.top + margin.bottom + border.top + border.bottom + padding.top + padding.bottom;
           css_min_size = get_number_ceil (style->size->min_width);
           css_min_for_size = get_number_ceil (style->size->min_height);
+          widget_margins_for_size = widget->priv->margin.top + widget->priv->margin.bottom;
         }
       else
         {
@@ -203,6 +205,7 @@ gtk_widget_query_size_for_orientation (GtkWidget        *widget,
           css_extra_for_size = margin.left + margin.right + border.left + border.right + padding.left + padding.right;
           css_min_size = get_number_ceil (style->size->min_height);
           css_min_for_size = get_number_ceil (style->size->min_width);
+          widget_margins_for_size = widget->priv->margin.left + widget->priv->margin.right;
         }
 
       GtkLayoutManager *layout_manager = gtk_widget_get_layout_manager (widget);
@@ -223,7 +226,6 @@ gtk_widget_query_size_for_orientation (GtkWidget        *widget,
               int adjusted_for_size;
               int minimum_for_size = 0;
               int natural_for_size = 0;
-              int dummy = 0;
 
               /* Pull the minimum for_size from the cache as it's needed to adjust
                * the proposed 'for_size' */
@@ -235,10 +237,7 @@ gtk_widget_query_size_for_orientation (GtkWidget        *widget,
               if (for_size < MAX (minimum_for_size, css_min_for_size))
                 for_size = MAX (minimum_for_size, css_min_for_size);
 
-              adjusted_for_size = for_size;
-              gtk_widget_adjust_size_allocation (widget, OPPOSITE_ORIENTATION (orientation),
-                                                 &for_size, &natural_for_size,
-                                                 &dummy, &adjusted_for_size);
+              adjusted_for_size = for_size - widget_margins_for_size;
               adjusted_for_size -= css_extra_for_size;
               if (adjusted_for_size < 0)
                 adjusted_for_size = MAX (minimum_for_size, css_min_for_size);
@@ -267,7 +266,6 @@ gtk_widget_query_size_for_orientation (GtkWidget        *widget,
               int adjusted_for_size;
               int minimum_for_size = 0;
               int natural_for_size = 0;
-              int dummy = 0;
 
               /* Pull the minimum for_size from the cache as it's needed to adjust
                * the proposed 'for_size' */
@@ -278,10 +276,7 @@ gtk_widget_query_size_for_orientation (GtkWidget        *widget,
               if (for_size < MAX (minimum_for_size, css_min_for_size))
                 for_size = MAX (minimum_for_size, css_min_for_size);
 
-              adjusted_for_size = for_size;
-              gtk_widget_adjust_size_allocation (widget, OPPOSITE_ORIENTATION (orientation),
-                                                 &for_size, &natural_for_size,
-                                                 &dummy, &adjusted_for_size);
+              adjusted_for_size = for_size - widget_margins_for_size;
 
               adjusted_for_size -= css_extra_for_size;